package com.platform.acl.Utils;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.platform.acl.entity.VO.ConditionUserVo;
import com.platform.acl.entity.excel.UserInfo;
import com.platform.acl.service.UserRoleService;
import com.platform.servicebase.exceptionHander.MyExceptionHandler;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.List;


/**
 * @author CZF
 * @create 2022-03-02 21:59
 */
public class ExcelUtils {

    /**
     * 判断上传的Excel文件是否符合格式要求
     *
     * @param excel 上传的Excel文件
     * @return boolean true表示符合文件格式要求，false表示不符合文件格式要求
     */
    public static boolean isExcel(MultipartFile excel) {

        //获取文件名
        String fileName = excel.getOriginalFilename();
        //判断文件名是否符合文件格式
        boolean flag = (fileName == null || (!fileName.toLowerCase().endsWith(".xls") && !fileName.toLowerCase().endsWith(".xlsx")));

        if (flag) {
            return false;
        }

        return true;
    }


    /**
     * 设置文件响应信息，并返回字节输出流
     *
     * @param fileName 文件名
     * @param response HttpServletResponse响应
     * @return OutputStream 字节输出流
     */
    public static OutputStream setResponse(String fileName, HttpServletResponse response){

        //!!! swagger 接收文件文件名会中文乱码 ！！！
        try {
            //设置文件ContentType类型
            response.setContentType("application/vnd.ms-excel");
            //设置服务器响应数据的编码
            response.setCharacterEncoding("UTF-8");
            //设置文件头
            response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
            return response.getOutputStream();
        } catch (IOException e) {
            throw new MyExceptionHandler(1,"生成excel文件失败");
        }

    }

    /**
     *
     * @param outputStream 响应流
     * @param fileName 返回的excel的文件名
     * @param sheetName sheet名
     * @param pageNum 条件查询总页数（需要往数据库查）
     * @param userRoleService 便于分页查询数据库，减轻内存压力
     * @param conditionUserVo 根据前端 条件查询 内容生成excel
     */
    public static void writeExcel(OutputStream outputStream, String fileName, String sheetName, int pageNum, UserRoleService userRoleService, ConditionUserVo conditionUserVo) {
        //指定以哪个class来构建excel表头
        ExcelWriter excelWriter = EasyExcel.write(outputStream, UserInfo.class).build();
        //指定写到哪个sheet
        WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build();

        //把真正的数据list写入excel中
        //一页一页地调数据库，把符合当前条件的所有数据查询出来
        for(int i =0 ;i<pageNum;i++){
            List<UserInfo> dataList = userRoleService.UserInfoByPage(i,conditionUserVo);
            excelWriter.write(dataList,writeSheet);
        }

        if(excelWriter!=null){
            excelWriter.finish();
        }



    }


}
